package com.wjw.rabbit.all;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 完整的声明创建方式，不在图形化界面进行交换机和队列的绑定
 * 创建一个direct类型的,路由Key模式的交换机
 * 生产者(发生消息)
 * RabbitMQ的访问地址：http://127.0.0.1:15672/
 * RabbitMQ的账号密码：admin/admin
 */
public class Producer {

    //所有的中间件都是基于TCP/IP协议,RabbitMQ遵循的是amqp协议
    //ip port
    public static void main(String[] args) {
        //1.创建连接工程
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");//RabbitMQ服务的IP
        factory.setPort(5672);//端口
        factory.setUsername("admin");//RabbitMQ的用户
        factory.setPassword("admin");//RabbitMQ的密码
        factory.setVirtualHost("/");//虚拟访问节点

        Connection connection = null;
        Channel channel = null;
        try {
            //2.创建连接Connection
            connection = factory.newConnection("生产者");
            //3.创建连接获取通道Channel
            channel = connection.createChannel();

            String message = "Hello RabbitMQ direct All 哈哈哈！！！！";//要发送的消息
            String exchangeName = "direct_message_exchange";//交换机名称
            String exchangeType = "direct";//交换机类型

            /**
             * 4.定义交换机:
             * 参数一：交换机名称
             * 参数二：交换机类型
             * 参数三：是否持久化,RabbitMQ重启后,交换机是否会移除
             */
            channel.exchangeDeclare(exchangeName,exchangeType,true);

            /**
             * 5.定义队列：可以在生产者或消费者任意一方进行声明
             * 参数一：队列名称
             * 参数二：是否持久化：
             * 参数三：是否具有排他性:是否是独占独立
             * 参数四：是否自动删除：随着最后一个消费者消费信息完毕,是否把该队列自动删除
             * 参数五：携带额外的参数
             */
            channel.queueDeclare("queue3",true,false,false,null);
            channel.queueDeclare("queue4",true,false,false,null);
            channel.queueDeclare("queue5",true,false,false,null);

            /**
             * 6.将队列和交换机进行绑定
             * 参数一：队列名称
             * 参数二：交换机名称
             * 参数三：路由key
             */
            String routingKey1 = "users";
            String routingKey2 = "goods";
            String routingKey3 = "orders";
            channel.queueBind("queue3",exchangeName,routingKey1);
            channel.queueBind("queue4",exchangeName,routingKey2);
            channel.queueBind("queue5",exchangeName,routingKey3);

            /**
             * 7.通过交换机将消息发送到队列中
             * 参数一：交换机名称
             * 参数二：路由key
             * 参数三：其他参数
             * 参数四：发送的消息
             */
            channel.basicPublish(exchangeName,routingKey1,null,message.getBytes());
            channel.basicPublish(exchangeName,routingKey2,null,message.getBytes());
            channel.basicPublish(exchangeName,routingKey3,null,message.getBytes());
            System.out.println("消息发生成功！");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }finally {
            //7.关闭通道
            if(channel != null && channel.isOpen()){
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            //8.关闭连接
            if(connection != null && connection.isOpen()){
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }//main

}
